import fs from 'fs';
import sharp from 'sharp';
import { filedbService } from './database/filedb';
import { tagdbService } from './database/tagdb';

class WallpapperService {
  /**
   * 生成缩略图，返回buffer数据
   */
  generateThumbnail(originFilePath: string): Promise<Buffer> {
    return new Promise((resolve, reject) => {
      sharp(originFilePath)
        .resize(200)
        .toBuffer()
        .then((data) => {
          resolve(data);
        })
        .catch((error) => {
          reject(error);
        });
    });
  }

  /**
   * 保存文件到数据库
   */
  async addFile(file, tags) {
    const originBody = fs.readFileSync(file.filepath, 'base64');

    // 根据文件生成缩略图
    const thumbnail = await this.generateThumbnail(file.filepath);

    // 保存文件映射关系到sqlitedb
    filedbService.addFile({
      filename: file.originalFilename,
      tags,
      thumbnail,
      originBody
    });
  }

  /**
   * 查询文件映射关系
   */
  queryFile(params) {
    // 查询全部
    if (!params || !Object.keys(params).length) {
      return filedbService.getAllFile();
    }

    // 根据名称或分类同时查询
    return filedbService.getFile(params);
  }

  /**
   * 删除file表中文件映射关系
   */
  deleteFile(id) {
    return filedbService.deleteFile(id);
  }

  /**
   * 添加标签到tag表
   * @param tag
   */
  addTag(tag) {
    tagdbService.addTag(tag);
  }

  /**
   * 查询tag表中所有数据
   * @param tag
   */
  queryAllTag() {
    return tagdbService.queryAllTag();
  }

  /**
   * 删除tag表中数据
   */
  deleteTag(id) {
    return tagdbService.deleteTag(id);
  }
}

WallpapperService.toString = () => '[class WallpapperService]';
const wallpaperService = new WallpapperService();

export { WallpapperService, wallpaperService };
